#include "Sql_list.h"

//顺序表的初始化
Sql_list * Init_Sql_List(int max)
{
    if(0 >=max)
    {
        printf("创建空间太小\n");
        return NULL;
    }

    //创建动态空间
    Sql_list *L = (Sql_list *)malloc(sizeof(Sql_list));
    if(NULL == L)
    {
        printf("顺序表创建动态空间失败\n");
        return NULL;
    }

    L->data = (Element_data *)malloc(max * sizeof(Element_data));
    if(NULL == L->data)
    {
        printf("顺序表创建动态空间失败\n");
        return NULL;
    }
    L->len = 0;
    L->max = max;

    return  L;
}

//顺序表的插入
int tail_insert_tail(Sql_list *L ,Element_data data)
{
    if(NULL == L)
    {
        printf("顺序表为NULL\n");
        return EOF;
    }
    if(NULL == L->data)
    {
        printf("顺序表空间为NULL\n");
        return EOF;
    }
    if(L->max <= L->len)
    {
        printf("顺序表已满\n");
        return EOF;
    }
    L->data[L->len] =data ;
    L->len++;
}

//顺序表的遍历
void printf_Sql_List(Sql_list *L)
{
    if(NULL == L)
    {
        printf("顺序表为NULL\n");
        return ;
    }
    if(NULL == L->data)
    {
        printf("顺序表为NULL");
        return ;
    }
    if(0 == L->len)
    {
        printf("顺序表内无数据\n");
        return ;
    }
    for (size_t i = 0; i < L->len; i++)
    {
        printf("姓名:%s 性别:%s 年龄:%d 学号:%d 成绩:%d\n",L->data[i].name,L->data[i].sex,L->data[i].age,L->data[i].id,L->data[i].sco);
    }
}

//顺序表的销毁
void Destroy_Sql_List(Sql_list **L)
{
    if(NULL == *L)
    {
        printf("表为空\n");
        return ;
    }
    if(NULL == (*L)->data)
    {
        printf("表为空\n");
        return ;
    }

    //销毁数据
    free((*L)->data);
    (*L)->data =NULL;

    //销毁表
    free(*L);
    *L = NULL;
}

//顺序表的扩容
Element_data *Expand_Sql_List(Sql_list *L,int num)
{
    if(NULL == L)
    {
        printf("顺序表为NULL\n");
        return NULL;
    }
    if(NULL == L->data)
    {
        printf("顺序表为NULL\n");
        return NULL;
    }
    if(num == L->max)
    {
        printf("无操作\n");
        return NULL;
    }

    //为新数据创建空间
    Element_data *new_data = (Element_data *)malloc(num *sizeof(Element_data));

    if(num < L->max)
    {
        if(num < L->len)
        {
            char ch = 0;
            printf("新空间不能全部存放原来的数据 是否继续执行(y or n)?");
            ch = getchar();
            if('N' == ch)
            {
                return NULL;
            }
            L->len = num;
        }
        //缩容
        for (size_t i = 0; i < L->len && i < num; i++)
        {
            new_data[i] = L->data[i];
        }
    }
    else
    {
        //为数据空间写入数据
        for (size_t i = 0; i < L->len; i++)
        {
            new_data[i]  = L->data[i];
        }
    }
    // 释放原空间
    free(L->data);

    // 将表的data指向新空间
    L->data = new_data;

    // 修改max的值
    L->max = num;

    // 返回新数据的地址
    return new_data;

}